#pragma once
#include <fstream>
#include <mutex>
namespace raftStoreDataBase
{
    /**
     * @brief 这个初始化的时候，就已经设置好了文件名的，因此后面只需打开即可
     *
     */
    class Persister
    {
    public:
        explicit Persister( int index );
        bool BothOpenFile();
        void BothSave( std::string raftstate, std::string snapshot );
        void BothCloseFile();
        void saveRaftState( const std::string &data );
        long long RaftStateSize() { return m_raftStateSize; }
        std::string ReadRaftState();
        std::string ReadSnapShot();
        ~Persister();

    private:
        std::mutex m_mutex;       // 这是锁，用于安全读取数据
        std::string m_raftState;  // 这是下层raft的状态
        std::string m_snapShot;   // 这是快照数据

        const std::string m_raftStateFileName;

        const std::string m_snapShotFileName;

        // 这是输出的流，因为是持久化存储，所以不需要读取
        std::ofstream m_raftStateOutPutStream;

        std::ofstream m_snapShotOutPutStream;

        long long m_raftStateSize;  // 记录当前raft状态的大小
    };
}  // namespace raftStoreDataBase